package com.sky.service;

import com.sky.dto.*;
import com.sky.result.PageResult;
import com.sky.vo.OrderPaymentVO;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderSubmitVO;
import com.sky.vo.OrderVO;

import java.security.GeneralSecurityException;

/**
 * @Description OrderService
 * @Author zhuzi
 * @Date 2023/10/05
 */
public interface OrderService {

    /**
     * 提交订单
     *
     * @param ordersSubmitDTO OrdersSubmitDTO
     * @return OrderSubmitVO
     */
    OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO);

    /**
     * 微信支付
     *
     * @param orderNumber String
     * @return OrderPaymentVO
     */
    OrderPaymentVO wechatPayment(String orderNumber);

    /**
     * 支付宝支付
     *
     * @param orderNumber String
     * @return OrderPaymentVO
     */
    OrderPaymentVO alipayPayment(String orderNumber);

    /**
     * 处理微信支付完成的响应结果
     *
     * @param body String
     */
    void wechatPost(String body) throws GeneralSecurityException;

    /**
     * 仅供apifox测试使用的支付接口
     *
     * @param orderNumber String
     */
    void apifoxPay(String orderNumber);

    /**
     * 获取历史订单
     *
     * @param ordersPageQueryDTO OrdersPageQueryDTO
     * @return PageResult
     */
    PageResult historyOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 查询订单详情
     *
     * @param orderId Long
     * @return OrderVO
     */
    OrderVO getOrderDetails(Long orderId);

    /**
     * 用户取消订单
     *
     * @param orderId Long
     */
    void userCancelOrder(Long orderId);

    /**
     * 再来一单
     *
     * @param orderId Long
     */
    void repetitionOrder(Long orderId);

    /**
     * 订单查询
     *
     * @param ordersPageQueryDTO OrdersPageQueryDTO
     * @return PageResult
     */
    PageResult searchOrders(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 各个状态的订单数量统计
     *
     * @return OrderStatisticsVO
     */
    OrderStatisticsVO getStatistics();

    /**
     * 接单
     *
     * @param ordersConfirmDTO OrdersConfirmDTO
     */
    void confirmOrder(OrdersConfirmDTO ordersConfirmDTO);

    /**
     * 拒单
     *
     * @param ordersRejectionDTO OrdersRejectionDTO
     */
    void rejectionOrder(OrdersRejectionDTO ordersRejectionDTO);

    /**
     * 商家取消订单
     *
     * @param ordersCancelDTO OrdersCancelDTO
     */
    void adminCancelOrder(OrdersCancelDTO ordersCancelDTO);

    /**
     * 派送订单
     *
     * @param orderId Long
     */
    void deliveryOrder(Long orderId);

    /**
     * 订单完成
     *
     * @param orderId Long
     */
    void completeOrder(Long orderId);

    /**
     * 用户催单
     *
     * @param orderId Long
     */
    void reminderOrder(Long orderId);

}
